﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GcmpModelInterface.h"
#include "IObject.h"
#include "OwnerPtr.h"
#include <map>
#include <set>
#include "GcmpApiDeclaration.h"

namespace gcmp
{
    class IDatasetFilter;
    class IDocument;

    /// \brief 协同构件过滤器管理器
    ///
    /// 协同构件过滤器管理器为单例类
    FINAL_INTERFACE class GCMP_MODEL_INTERFACE_EXPORT IDatasetFilterManager : public IObject
    {
        DEFINE_CAST_DERIVED(gcmp::IDatasetFilterManager, gcmp::IObject)
    public:
        /// \brief 获取协同构件过滤器管理器
        ///
        /// \return 构件过滤器管理器指针
        static IDatasetFilterManager* Get();

        /// \brief 获取文档关联的协同构建过滤器列表
        ///
        /// \param pDoc 主文档
        /// \param datasetFilterVer 协同构件过滤器列表
        /// \return true 获取列表成功 false 
        GCMP_DEPRECATED_API(2022/10/01)
        virtual bool GetDatasetFilters(IDocument* pDoc, std::vector<OwnerPtr<IDatasetFilter>>& datasetFilterVec) = 0;

        /// \brief 获取工作单元参照的active状态的过滤器
        ///
        /// \param pDoc 主文档
        /// \param datasetFilterVer active状态的过滤器(每个被参照工作单元只会有一个active状态的filter)
        /// \return true 获取列表成功 false 获取列表失败
        virtual bool GetActiveDatasetFilters(IDocument* pDoc, std::vector<OwnerPtr<IDatasetFilter>>& datasetFilterVec) = 0;

        /// \brief 获取文档关联的协同构件过滤器列表
        ///
        /// \param pDoc 主文档
        /// \return std::vector<OwnerPtr<ICollaborationElementFilter>> 协同构件过滤器列表
        GCMP_DEPRECATED_API(2021/01/01) 
        virtual std::vector<OwnerPtr<IDatasetFilter>> GetDatasetFilters(IDocument* pDoc) = 0;

        /// \brief 获取指定的文档关联的协同构件过滤器
        ///
        /// \param pDoc 主文档
        /// \param id 过滤器Id
        /// \return OwnerPtr<ICollaborationElementFilter>
        virtual OwnerPtr<IDatasetFilter> GetDatasetFilter(const std::wstring& id) = 0;
        
        /// \brief 保存过滤器到云端
        ///
        /// \param pFilter 过滤器
        /// \return OwnerPtr<IDatasetFilter> 保存完成的过滤器
        virtual bool Save(IDatasetFilter* pFilter) = 0;

        /// \brief 删除过滤器
        ///
        /// \param id 过滤器id
        /// \return bool 是否删除成功
        GCMP_OBSOLETE_API(2021/03/01, Delete(const std::wstring& id, bool& bDeleted))
        virtual bool Delete(const std::wstring& id) = 0;

        /// \brief 删除过滤器
        ///
        /// \param id 过滤器id
        /// \param bDeleted 是否删除成功
        /// \return true 调用成功 false 调用失败
        GCMP_DEPRECATED_API(2022/10/01)
        virtual bool Delete(const std::wstring& id, bool& bDeleted) = 0;

        /// \brief 返回有更新的链接文档的dataset id列表
        ///
        /// \return 有更新的链接文档dataset id列表
        virtual std::vector<std::wstring> GetToBeUpdateLinkDatasetIds(IDocument* pDoc) = 0;

        /// \brief 设置当前用户操作的seesion id
        ///
        /// \return 不需要返回
        virtual void SetSessionId(const std::string& sessionId) = 0;
    };
}
